package com.fanshuai2.niuke.strings;
import java.util.*;

/**
 * IP地址是由4个0-255之间的整数构成的，用"."符号相连。
 * 二进制的IP地址格式有32位，例如：10000011，01101011，00000011，00011000;每八位用十进制表示就是131.107.3.24
 * 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
 * 子网掩码与IP地址结构相同，是32位二进制数，由1和0组成，且1和0分别连续，其中网络号部分全为“1”和主机号部分全为“0”。
 * 你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数，左边部分都是1，右边部分都是0。
 * 利用子网掩码可以判断两台主机是否在同一子网中。
 * 若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算（按位与/AND）后的结果相同，则说明这两台主机在同一子网中。
 */
public class IpInNetWork {
    static boolean ipValid(String ip) {
        if (null == ip || ip.length() == 0) {
            return false;
        }
        String[] arr = ip.split("\\.");
        if (arr.length != 4) {
            return false;
        }
        for (String sub: arr) {
            for (char c: sub.toCharArray()) {
                if (c < '0' || c > '9') {
                    return false;
                }
            }
            int v = Integer.valueOf(sub);
            if (v < 0 || v > 255) {
                return false;
            }
        }
        return true;
    }

    static boolean maskValid(String mask) {
        if (!ipValid(mask)) {
            return false;
        }

        String binary = "";
        String[] arr = mask.split("\\.");
        for (String sub: arr) {
            String subBinary = Integer.toBinaryString(Integer.valueOf(sub));
            while (subBinary.length() < 8) {
                subBinary = "0" + subBinary;
            }
            binary += subBinary;
        }
        int index = binary.lastIndexOf("1");
        if (index == -1 || index == binary.length() - 1) {
            return false;
        }

        boolean valid = true;
        for (int i = 0; i <= index; i++) {
            if (binary.charAt(i) == '0') {
                valid = false;
                break;
            }
        }

        return valid;
    }

    static boolean isInNetwork(String ip1, String ip2, String mask) {
        long iplong1 = ip2Long(ip1);
        long iplong2 = ip2Long(ip2);
        long masklong = ip2Long(mask);

        return (iplong1 & masklong) == (iplong2 & masklong);
    }

    static long ip2Long(String ip) {
        long result = 0;
        String[] arr = ip.split("\\.");
        for (String sub: arr) {
            int v = Integer.valueOf(sub);
            result = result * 256 + v;
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        while (in.hasNextLine()) {
            String mask = in.nextLine();
            String ip1 = in.nextLine();
            String ip2 = in.nextLine();

            int r = -1;
            if (!maskValid(mask) || !ipValid(ip1) || !ipValid(ip2)) {
                r = 1;
            } else {
                boolean inNetwork = isInNetwork(ip1, ip2, mask);
                if (inNetwork) {
                    r = 0;
                } else {
                    r = 2;
                }
            }
            System.out.println(r);
        }
    }
}
